1 using ProceduralToolkit.Examples.UI;
2 using UnityEngine;
3
4 namespace ProceduralToolkit.Examples
5 {
6 public class BuildingGeneratorConfigurator : ConfiguratorBase
7 {
8 public MeshFilter buildingMeshFilter;
9 public MeshFilter platformMeshFilter;
10 public RectTransform leftPanel;
11 public bool constantSeed = false;
12 public BuildingGenerator.Config config = new BuildingGenerator.Config();
13
14 private const int minWidth = 10;
15 private const int maxWidth = 30;
16 private const int minLength = 10;
17 private const int maxLength = 60;
18 private const int minFloorCount = 1;
19 private const int maxFloorCount = 10;
20
21 private const float platformHeight = 0.5f;
22 private const float platformRadiusOffset = 2;
23
24 private BuildingGenerator generator;
25 private Mesh buildingMesh;
26 private Mesh platformMesh;
27
28 private void Awake()
29 {
30 Generate();
31 SetupSkyboxAndPalette();
32
33 InstantiateControl<SliderControl>(leftPanel)
34 .Initialize("Width", minWidth, maxWidth, (int) config.width, value =>
35 {
36 config.width = value;
37 Generate();
38 });
39
40 InstantiateControl<SliderControl>(leftPanel)
41 .Initialize("Length", minLength, maxLength, (int) config.length, value =>
42 {
43 config.length = value;
44 Generate();
45 });
46
47 InstantiateControl<SliderControl>(leftPanel)
48 .Initialize("Floors", minFloorCount, maxFloorCount, config.floors, value =>
49 {
50 config.floors = value;
51 Generate();
52 });
53
54 InstantiateControl<ToggleControl>(leftPanel).Initialize("Has attic", config.hasAttic, value =>
55 {
56 config.hasAttic = value;
57 Generate();
58 });
59
60 InstantiateControl<ButtonControl>(leftPanel).Initialize("Generate", () => Generate());
61 }
62
63 private void Update()
64 {
65 UpdateSkybox();
66 }
67
68 public void Generate(bool randomizeConfig = true)
69 {
70 if (constantSeed)
71 {
72 Random.InitState(0);
73 }
74
75 if (randomizeConfig)
76 {
77 GeneratePalette();
78
79 config.palette.wallColor = GetMainColorHSV().ToColor();
80
81 config.roofConfig.type = RandomE.GetRandom(RoofType.Flat, RoofType.Hipped, RoofType.Gabled);
82 }
83
84 if (generator == null)
85 {
86 generator = new BuildingGenerator();
87 }
88
89 var buildingDraft = generator.Generate(config);
90 AssignDraftToMeshFilter(buildingDraft, buildingMeshFilter, ref buildingMesh);
91
92 float buildingRadius = Mathf.Sqrt(config.length/2*config.length/2 + config.width/2*config.width/2);
93 float platformRadius = buildingRadius + platformRadiusOffset;
94
95 var platformDraft = Platform(platformRadius, platformHeight);
96 AssignDraftToMeshFilter(platformDraft, platformMeshFilter, ref platformMesh);
97 }
98 }
99 }